// Copyright 2021 by 马万里. All rights reserved.
// 开发团队 ：   鸡中之霸
// 开发人员 ：   马万里
// 开发时间 ：   2021/2/24 12:14
// 文件名称 ：   filemeta.go
// 工程名称 ：   netpan
// 开发工具 ：   GoLand
//

package meta

import (
	myDB "johnsonsmile.cn/netpan/db"
	"sort"
)

// 文件元信息结构
type FileMeta struct {
	FileSha1 string
	FileName string
	FileSize int64
	Location string
	UploadAt string
}

var fileMetas map[string]*FileMeta

func init() {
	fileMetas = make(map[string]*FileMeta)
}

// UpdateFileMeta: 新增/更新文件元信息
func UpdateFileMeta(fmeta *FileMeta) {
	fileMetas[fmeta.FileSha1] = fmeta
}

// UpdateFileMetaDB: 新增/更新文件元信息到mysql中
func UpdateFileMetaDB(fmeta *FileMeta, isNew bool) bool {
	if isNew {
		return myDB.OnFileUploadFinished(fmeta.FileSha1, fmeta.FileName, fmeta.FileSize, fmeta.Location)
	}
	return myDB.OnFileUpdateFinished(fmeta.FileSha1, fmeta.FileName)
}

// GetFileMeta: 通过sha1值获取文件的元信息
func GetFileMeta(fileSha1 string) *FileMeta {
	return fileMetas[fileSha1]
}

// GetFileMetaDB: 通过sha1值从mysql获取文件的元信息
func GetFileMetaDB(fileSha1 string) *FileMeta {
	tfile, err := myDB.GetFileMeta(fileSha1)
	if err != nil {
		return nil
	}
	fmeta := &FileMeta{
		FileSha1: tfile.FileHash,
		FileName: tfile.FileName.String,
		FileSize: tfile.FileSize.Int64,
		Location: tfile.FileAddr.String,
	}
	return fmeta
}

// GetLastFileMetas: 批量获取问价元信息列表
func GetLastFileMetas(count int) []*FileMeta {
	fMetaArray := make([]*FileMeta, 0)
	for _, v := range fileMetas {
		fMetaArray = append(fMetaArray, v)
	}
	//sort.Slice(fMetaArray, func(i, j int) bool {
	//	fileMeta1 := fMetaArray[i]
	//	t1, _ := time.Parse("2006-01-02 15:04:05", fileMeta1.UploadAt)
	//	fileMeta2 := fMetaArray[j]
	//	t2, _ := time.Parse("2006-01-02 15:04:05", fileMeta2.UploadAt)
	//	return t1.After(t2)
	//})
	if count > len(fMetaArray) {
		return fMetaArray
	}
	sort.Sort(ByUploadTime(fMetaArray))
	return fMetaArray[0:count]
}

// GetLastFileMetasDB: 批量从mysql中获取文件元信息
func GetLastFileMetasDB(count int) ([]*FileMeta, error) {
	tfiles, err := myDB.GetFileMetaFileList(count)
	if err != nil {
		return make([]*FileMeta, 0), err
	}

	tfilesm := make([]*FileMeta, len(tfiles))
	for i, tfile := range tfiles {
		tfilesm[i] = &FileMeta{
			FileSha1: tfile.FileHash,
			FileName: tfile.FileName.String,
			FileSize: tfile.FileSize.Int64,
			Location: tfile.FileAddr.String,
		}
	}
	return tfilesm, err
}

// RemoveFileMeta: 删除filemeta信息
func RemoveFileMeta(fileSha1 string) {
	delete(fileMetas, fileSha1)
}

// RemoveFileMetaDB: 从mysql中删除文件
func RemoveFileMetaDB(fileSha1 string) bool {
	return myDB.OnFileRemoved(fileSha1)
}
